package legumes.client.ui.widgets.window.connexion;

import legumes.client.resources.PNResources;
import legumes.client.services.callbacks.AddCustomerCallback;
import legumes.client.services.util.rpc.RPCCallSequencer;
import legumes.client.ui.widgets.form.item.EmailFormItem;
import legumes.client.ui.widgets.form.item.PhysicalPersonNameFormItem;
import legumes.shared.domain.Customer;
import legumes.shared.domain.CustomerRole;

import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.CloseClickHandler;
import com.smartgwt.client.widgets.events.CloseClientEvent;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.ButtonItem;
import com.smartgwt.client.widgets.form.fields.CheckboxItem;
import com.smartgwt.client.widgets.form.fields.PasswordItem;
import com.smartgwt.client.widgets.form.fields.TextAreaItem;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
import com.smartgwt.client.widgets.layout.VLayout;

public class CreateNewAccountWindow extends Window {

	private DynamicForm formPanel;
	
	private PhysicalPersonNameFormItem name;
	private EmailFormItem email;
	private EmailFormItem emailConfirm;
	private PasswordItem newPassword;
	private PasswordItem newPasswordConfirmation;
	private TextAreaItem conditionTxtA;
	private CheckboxItem acceptConditionCheckBox;
	
	
	private ButtonItem okButton;
	private ButtonItem cancel;
	
	
	public CreateNewAccountWindow(){
		super();
		setTitle("<img src=\"" + PNResources.INSTANCE.userAddIcon().getURL() + "\" />&nbsp;Cr&eacute;&eacute;r un nouveau compte");
		setWidth(640);
		setHeight(480);
		setMargin(10);
		setShowCloseButton(true);
		setShowMinimizeButton(false);
		setAutoCenter(true);
		setShowModalMask(true);
		addCloseClickHandler(new CloseClickHandler() {  
            public void onCloseClick(CloseClientEvent event) {  
            	destroy();  
            }  
        });
		
		createFormFields();
		createBuutons();
		createForm();
		
		Label lab = new Label("SIMPLE, FACILE & RAPIDE : En créant un compte vous pourrez acheter et, ou vendre plus facilement et plus rapidement : vous pourez enregsitrer vos adresses de livraisons, accéder directement à vos vendeurs préférés, donner votre avis et bien plus de choses encore !");
		
		VLayout vl = new VLayout();
//		vl.setMembersMargin(10);
		vl.setMargin(10);
		vl.setMembers(lab, formPanel);
		
		addItem(vl);
		draw();
		name.focusInItem();
	}
	
	private void createForm(){
		formPanel = new DynamicForm(); 
//		formPanel.setWidth100();
		formPanel.setHeight100();
		formPanel.setMargin(5);
		formPanel.setNumCols(4);
		formPanel.setTitleWidth(200);
		formPanel.setWrapItemTitles(true);
		formPanel.setItems(name, email, emailConfirm, newPassword, newPasswordConfirmation, 
				conditionTxtA,
				acceptConditionCheckBox,
				cancel, okButton);
		
	}
	
	private void createFormFields() {
		name = new PhysicalPersonNameFormItem("Nom", "Dupond");
		name.setColSpan(4);
		
		email = new EmailFormItem("email", "E-mail");
		email.setColSpan(4);
		
		emailConfirm = new EmailFormItem("emailConfirm", "Confirmer votre E-mail");
		emailConfirm.setColSpan(4);
		
		newPassword = new PasswordItem("newpassword1", "Mot de passe");
		newPassword.setColSpan(4);
		newPasswordConfirmation = new PasswordItem("newpassword2", "Confirmer le nouveau mot de passe");
		newPasswordConfirmation.setColSpan(4);
		
		conditionTxtA = new TextAreaItem("conditionTxtA", "Conditions d'utilisation");
		conditionTxtA.setValue("");
		conditionTxtA.setColSpan(4);
		conditionTxtA.setWidth("*");
		
		acceptConditionCheckBox = new CheckboxItem("acceptCondition", 
				"<table><tr><td style=\"white-space:pre-wrap;\">" 
				+ "Veuillez cocher cette case afin de confirmer que vous avez lu et accepté l'ensemble des conditions d'utilisation et des règles visées ci-dessus. Assurez vous également que toutes les informations fournies sur cette page sont correctes (ou effectuez à présent toutes corrections nécessaires). En cliquant sur le bouton « J'accepte. Créer un compte » ci-dessous, vous validerez votre inscription et votre compte sera créé. <BR /> En cliquant sur « J'accepte » ci-dessous, vous acceptez les conditions d'utilisation ci-dessus ainsi que les règles de confidentialité."
				+ "</td></tr></table>"  );
		acceptConditionCheckBox.setWrapTitle(true);
		acceptConditionCheckBox.setColSpan(4);
		
		acceptConditionCheckBox.addChangedHandler(new ChangedHandler() {
			
			@Override
			public void onChanged(ChangedEvent event) {
				okButton.setDisabled(!acceptConditionCheckBox.getValueAsBoolean());
			}
		});
	}


	private void createBuutons(){
		okButton = new ButtonItem("ok", "J'accepte. Créer un compte.");
		okButton.setDisabled(true);
		okButton.setStartRow(false);
		okButton.setEndRow(false);
		okButton.setColSpan(2);
		okButton.setAlign(Alignment.CENTER);
		okButton.setIcon(PNResources.INSTANCE.validateIcon().getURL());
		okButton.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				if( formPanel.validate() && validateBuinessLogic() ){
					onCreateAccountAction();
				}
			}
		});
		
		cancel = new ButtonItem("cancel", "Annuler");
		cancel.setStartRow(true);
		cancel.setEndRow(false);
		cancel.setAlign(Alignment.CENTER);
		cancel.setColSpan(2);
		cancel.setTabIndex(103);
		cancel.setIcon(PNResources.INSTANCE.cancelIcon().getURL());
		cancel.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				hide();
			}
		});
	}
		
	private void onCreateAccountAction(){


		RPCCallSequencer callSequencer = new RPCCallSequencer();
		
		final Customer c = new Customer();
		c.setEmail(email.getValueAsString());
		c.setName(name.getValueAsString());
		c.setPassword(newPassword.getValueAsString());
		c.setRoles(CustomerRole.CUSTOMER);
		
		final AddCustomerCallback addCustomerCallback = new AddCustomerCallback(c);
		callSequencer.addCall(addCustomerCallback);
		callSequencer.addRunnable(new Runnable() {
			public void run() {
				Customer cAdded = addCustomerCallback.getAddedCustomer();
				if( cAdded == null ){
					SC.warn("Error" + addCustomerCallback.getThrowable());
				} else {
					//Because cAdded password is hashed
					onCustomerAccountCreated(cAdded.getEmail(), c.getPassword());
					destroy();
				}
			}
		});
		callSequencer.callSequence();
	}
		
	private boolean validateBuinessLogic(){
		if (!email.getValueAsString().equals(
				emailConfirm.getValueAsString())) {
			SC.warn("L'email n'est pas identique dans les deux champs de saisie !<br>"
							+ "Merci de les saisir à nouveau.");
			emailConfirm.clearValue();
			return false;
		}

		
		if (!newPassword.getValueAsString().equals(
				newPasswordConfirmation.getValueAsString())) {
			SC.warn("Le nouveau mot de passe n'est pas identique dans les deux champs de saisie !<br>"
							+ "Merci de les saisir à nouveau.");
			newPassword.clearValue();
			newPasswordConfirmation.clearValue();
			return false;
		}
		return true;
	}
	
	protected void onCustomerAccountCreated(String login_, String password_){
		
	}
}
